import numpy as np
from python_ai.common.xcommon import sep
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

# 请利用sklearn中的鸢尾花数据集和SVM算法，并结合网格搜索方法，对数据进行分类。具体要求如下：
# 1、	加载鸢尾花数据集( 10分)
x, y = load_iris(return_X_y=True)
x = StandardScaler().fit_transform(x)

# 2、	将鸢尾花数据集分割为训练集(70%)和测试集(30%)( 10分)
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7)

# 3、	使用网格搜索交叉验证，获取数据信息
# a)	定义SVM分类器( 10分)
svc = SVC()
# b)	对gamma和C进行调参( 10分)
params = {'gamma': [0, 0.1, 0.5, 2, 5, 10],
          'C': [0.1, 0.5, 2, 5, 10],
          'kernel': ['rbf', 'poly', 'linear', 'sigmoid'],
          }
# c)	使用5折交叉验证( 10分)
clf = GridSearchCV(svc,
                   params,
                   cv=5,  # ATTENTION
                   iid=True,
                   )

# d)	拟合训练集数据( 10分)
clf.fit(x_train, y_train)

# e)	打印最优得分( 10分)
print(f'最优得分: {clf.best_score_}')

# f)	打印最优参数( 10分)
print(f'最优参数: {clf.best_params_}')

# 4、	记录最优参数后，重新创建SVM模型，拟合训练数据集( 10分)
gamma = clf.best_params_['gamma']
C = clf.best_params_['C']
kernel = clf.best_params_['kernel']
svc_best = SVC(**(clf.best_params_))
svc_best.fit(x_train, y_train)

# 5、	打印输出模型得分( 10分)
s1 = svc_best.score(x_train, y_train)
s2 = svc_best.score(x_test, y_test)
print(f'Training score = {s1}')
print(f'Testing score = {s2}')
